package cn.sherer.utils;

import java.util.Date;
import java.util.Calendar;
import java.text.ParseException;
import java.text.SimpleDateFormat;

/**
 * 日期工具类
 */
public class DateUtils {

    /** 时间格式：HH:mm:ss */
    public static final String FORMAT_TIME = "HH:mm:ss";
    /** 时间格式：yyyy-MM-dd */
    public static final String FORMAT_DATE = "yyyy-MM-dd";
    /** 时间格式：yyyy-MM-dd HH:mm:ss */
    public static final String FORMAT_LONG_DATE = "yyyy-MM-dd HH:mm:ss";
    /** 时间格式：yyyy-MM-dd HH:mm:ss.SSS */
    public static final String FORMAT_LONG_DATE_TIME = "yyyy-MM-dd HH:mm:ss.SSS";

    // <editor-fold defaultstate="collapsed" desc="转换函数">

    /**
     * 转换时间类型
     * @param dateString 时间字符串
     * @return 时间类型的时间
     * @throws ParseException 转换异常
     * @deprecated 请使用 getDate 方法
     */
    public static Date CDate(String dateString) throws ParseException {
        return getDate(dateString);
    }

    // </editor-fold>

    // <editor-fold defaultstate="collapsed" desc="获取时间函数">

    /**
     * 获取当前时间
     * 格式：yyyy-MM-dd HH:mm:ss
     * 例子：2018-12-09 08:26:34
     * @return 当前时间
     */
    public static String getToday() {
        return format(FORMAT_LONG_DATE);
    }

    /**
     * 获取当前时间（格式化）
     * @param format 格式：y - 年，M - 月，d - 日，H - 小时，m - 分钟，s - 秒，S - 毫秒
     * @return 格式化后的当前时间
     */
    public static String getToday(String format) {
        return format(format);
    }

    /**
     * 获取昨天时间
     * 格式：yyyy-MM-dd HH:mm:ss
     * 例子：2018-12-09 08:26:34
     * @return 昨天时间
     */
    public static String getYesterday() {
        return getYesterday(FORMAT_LONG_DATE);
    }

    /**
     * 获取昨天时间（格式化）
     * @param format 格式：y - 年，M - 月，d - 日，H - 小时，m - 分钟，s - 秒，S - 毫秒
     * @return 格式化后的昨天时间
     */
    public static String getYesterday(String format) {
        Calendar calendar = getCalendar();
        calendar.add(Calendar.DAY_OF_YEAR, -1);
        return format(format, calendar.getTime());
    }

    /**
     * 获取日历对象
     * @return 日历对象
     */
    public static Calendar getCalendar() {
        return Calendar.getInstance();
    }

    /**
     * 获取日历对象
     * @param date 时间对象
     * @return 日历对象
     */
    public static Calendar getCalendar(Date date) {
        Calendar calendar = getCalendar();
        calendar.setTime(date);
        return calendar;
    }

    /**
     * 获取日历对象
     * @param dateString 时间字符串
     * @return 日历对象
     * @throws ParseException 转换异常
     */
    public static Calendar getCalendar(String dateString) throws ParseException {
        return getCalendar(getDate(dateString));
    }

    /**
     * 获取时间对象
     * @return 时间对象
     */
    public static Date getDate() {
        return getCalendar().getTime();
    }

    /**
     * 获取时间对象
     * @param dateString 时间字符串
     * @return 时间对象
     * @throws ParseException 转换异常
     */
    public static Date getDate(String dateString) throws ParseException {
        SimpleDateFormat sdf = new SimpleDateFormat(FORMAT_LONG_DATE);
        return sdf.parse(dateString);
    }

    /**
     * 格式化当前时间
     * @param format 格式：y - 年，M - 月，d - 日，H - 小时，m - 分钟，s - 秒，S - 毫秒
     * @return 格式化后的当前时间
     */
    public static String format(String format) {
        return format(format, getDate());
    }

    /**
     * 格式化时间
     * @param format 时间：y - 年，M - 月，d - 日，H - 小时，m - 分钟，s - 秒，S - 毫秒
     * @param date 时间
     * @return 格式化后的时间
     */
    public static String format(String format, Date date) {
        return new SimpleDateFormat(format).format(date);
    }

    /**
     * 获取当前时间戳
     * @return 当前时间戳
     */
    public static long getTimestamp() {
        return System.currentTimeMillis();
    }

    /**
     * 获取当前时间戳（秒）
     * @return 当前时间戳
     */
    public static long getTimestampSec() {
        return getTimestamp() / 1000;
    }

    // </editor-fold>

}
